/* FUNCIONES PARA MODIFICACION AUTOMATICA DE FORMATOS POR LA NUEVA RESOLUCION DE ARCA 
Detalles:

  Esto agrega un diseño estandar para aquellos formatos que tienen el código QR.
  Lo agrega en una posición específica relativa al QR, se puede modificar para arriba o para abajo
  para referencia, el QR hoy está en la posicion 203200 .. un número menor sería más arriba, uno mayor más abajo.
  
  La posición lateral no se puede modificar.
  (En modo experto se podría modificar tocando la función)
  
  SE PUEDE EJECUTAR UNA SOLA VEZ POR FORMATO !!! 
  Si quedó mal hay que arreglarlo desde el formulario o bien borrarlo en el formulario y ejecutar este scrip
  de nuevo.
  
 Ejemplos de uso: 

	-- Modifica el template de un formato en especial de un comprobante dado
	-- <cbteafip> es el numero de afip para el comprobante, en general si es factura = 1 y Nota de crédito = 3
	
	UPDATE COMFTO SET template = nuevoTemplate(template, -1, <cbteafip>) WHERE COD = 'FVE_MPB';
	UPDATE COMFTO SET mailtemplate = nuevoTemplate(mailtemplate, -1, <cbteafip>) WHERE COD = 'FVE_MPB';

	-- Modifica el template de un formato en especial y lo pone más arriba de lo que por defecto
	
	UPDATE COMFTO SET template = nuevoTemplate(template, 150000, <cbteafip>) WHERE COD = 'FVE_MPB';
	UPDATE COMFTO SET mailtemplate = nuevoTemplate(mailtemplate, 150000, <cbteafip>) WHERE COD = 'FVE_MPB';

	-- Modifica todos los templates de comprobantes electrónicos con letra B 
	
	BEGIN TRANSACTION;
	UPDATE COMFTO SET template = nuevoTemplate(template, -1, formatos.afipcbtetipo), 
					  mailtemplate = nuevoTemplate(mailtemplate, -1, formatos.afipcbtetipo)
	FROM (SELECT DISTINCT comxtal.codcomfto, cast(coalesce(equi.codificacion,'6') as integer) as afipcbtetipo
		  From comxtal
		  INNER JOIN COMFTO FTO ON FTO.COD = COMXTAL.CODCOMFTO
 		  INNER JOIN AFIPEQVCOM EQUI ON EQUI.TIPOCOM = COMXTAL.TIPOCOM AND EQUI.LETRA = COMXTAL.LETRA
	      WHERE comxtal.codcomfto = fto.cod AND comxtal.letra = 'B' and position ('QR' in fto.template) > 0 
 				and cast(coalesce(equi.codificacion,'6') as integer) in (6,7,8)) formatos
	WHERE comfto.cod = formatos.codcomfto and position('Transparencia' in comfto.template) = 0


 El diseño es de autoría del sr. Lalo Bece.
 No habría que hacer nada más que usar esta funcion
 
*/

DROP FUNCTION IF EXISTS extraer_cadena_codigoqr(cadena_entrada VARCHAR);

CREATE OR REPLACE FUNCTION extraer_cadena_codigoqr(cadena_entrada VARCHAR)
	RETURNS VARCHAR
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE 
AS $BODY$
DECLARE
    pos_codigoqr 	INTEGER;
    pos_object 	INTEGER;
    pos_end 		INTEGER;
    cadena_resultado 	TEXT;
    pos_object_actual 	INTEGER;
BEGIN
    -- Encuentra la posición de 'comm_electronico_codigoQR'
    pos_codigoqr := POSITION('comm_electronico_codigoQR' IN cadena_entrada);

    IF pos_codigoqr > 0 THEN
        -- Encuentra la última posición de 'object' antes de 'comm_electronico_codigoQR'
        pos_object := 0;
        pos_object_actual := POSITION('object' IN SUBSTRING(cadena_entrada, 1, pos_codigoqr));

        WHILE pos_object_actual > 0 LOOP
            pos_object := pos_object_actual;
            pos_object_actual := POSITION('object' IN SUBSTRING(cadena_entrada, pos_object + 1, pos_codigoqr - pos_object -1 ));
            IF pos_object_actual > 0 THEN
                pos_object_actual := pos_object_actual + pos_object;
            END IF;
        END LOOP;

        -- Encuentra la posición de 'end' después de 'comm_electronico_codigoQR'
        pos_end := POSITION('end' IN SUBSTRING(cadena_entrada, pos_codigoqr));

        IF pos_object > 0 AND pos_end > 0 THEN
            -- Extrae la subcadena
            cadena_resultado := SUBSTRING(cadena_entrada, pos_object, pos_codigoqr + pos_end - pos_object + 3);
            RETURN cadena_resultado;
        ELSE
            RETURN NULL; -- No se encontraron 'object' o 'end'
        END IF;
    ELSE
        RETURN NULL; -- No se encontró 'comm_electronico_codigoQR'
    END IF;
END;
$BODY$;

ALTER FUNCTION public.extraer_cadena_codigoqr(cadena_entrada VARCHAR)
    OWNER TO abacouser;	
	
DROP FUNCTION IF EXISTS extraer_valor_mmtop(cadena_entrada TEXT);

CREATE OR REPLACE FUNCTION extraer_valor_mmtop(cadena_entrada TEXT)
    RETURNS integer
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE 
AS $BODY$
DECLARE
    pos_mmtop INTEGER;
    pos_igual INTEGER;
    pos_mmwidth INTEGER;
    valor_mmtop INTEGER;
    subcadena TEXT;
BEGIN
    -- Encuentra la posición de 'mmtop'
    pos_mmtop := POSITION('mmTop' IN cadena_entrada);

    IF pos_mmtop > 0 THEN
        -- Encuentra la posición del '=' después de 'mmtop'
        pos_igual := POSITION('=' IN SUBSTRING(cadena_entrada, pos_mmtop));

        IF pos_igual > 0 THEN
            -- Encuentra la posición de 'mmWidth' después de 'mmtop'
            pos_mmwidth := POSITION('mmWidth' IN SUBSTRING(cadena_entrada, pos_mmtop));

            IF pos_mmwidth > 0 THEN
                -- Extrae la subcadena que contiene el valor numérico (CORRECTED LENGTH)
                subcadena := SUBSTRING(cadena_entrada, pos_mmtop + pos_igual + 1, pos_mmwidth - (pos_igual + 1) - 1);
            ELSE
                -- si no encuentra mmWidth, extrae hasta el final
                subcadena := SUBSTRING(cadena_entrada, pos_mmtop + pos_igual + 1);
            END IF;

            -- Convierte la subcadena a un valor numérico
            valor_mmtop := trim(subcadena)::INTEGER;
            RETURN valor_mmtop;
        ELSE
            RETURN NULL; -- No se encontró '='
        END IF;
    ELSE
        RETURN NULL; -- No se encontró 'mmtop'
    END IF;
EXCEPTION
  WHEN OTHERS THEN
    RETURN NULL; -- error al convertir a entero
END;
$BODY$;

ALTER FUNCTION public.extraer_valor_mmtop(cadena_entrada TEXT)
    OWNER TO abacouser;	
	

DROP FUNCTION IF EXISTS nuevoTemplate(varchar, integer);
DROP FUNCTION IF EXISTS nuevoTemplate(varchar, integer, integer);

CREATE OR REPLACE FUNCTION nuevoTemplate (cadena_entrada varchar, pBase integer, AfipCbte integer)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE 
AS $BODY$
DECLARE
	base  INTEGER;
	mmtopShape 		VARCHAR;
	mmTopTitulo 	VARCHAR;
	mmTopTituloIva 	VARCHAR;
	mmTopValorIva 	VARCHAR;
	mmTopTituloImpuestos 	VARCHAR;
	mmTopValorImpuestos 	VARCHAR;
	
	cadena_qr 		  VARCHAR;
	cadena_a_agregar  VARCHAR;
	pipeline		  VARCHAR;
  
BEGIN
    cadena_qr := extraer_cadena_codigoqr(cadena_entrada);
	
	if pBase = -1 then 
		if cadena_qr is null then 
		   base = 203200;
		else
		   base := extraer_valor_mmtop(cadena_qr);
		end if;
		base = base - 29368;
	else
	  base = pBase;
	end if;
	
	mmtopShape 		:= CAST(base as VARCHAR);
	mmTopTitulo 	:= CAST(base + 1323 as VARCHAR);
	mmTopTituloIva 	:= CAST(base + 6614 as VARCHAR);
	mmTopValorIva 	:= CAST(base + 6614 as VARCHAR);
	mmTopTituloImpuestos 	:= CAST(base + 11641 as VARCHAR);
	mmTopValorImpuestos 	:= CAST(base + 11641 as VARCHAR);
	
	cadena_a_agregar := 
	'object ppShape7: TppShape
		  UserName = ''Shape7''
		  Brush.Color = 15263976
		  Pen.Style = psClear
		  mmHeight = 16669
		  mmLeft = 9525
		  mmTop = <mmTopShape>    
		  mmWidth = 86784
		  BandType = 4
		end
		object ppLabel28: TppLabel
		  UserName = ''Label28''
		  AutoSize = False
		  Caption = '' Regimen de Transparencia Fiscal al Consumidor (Ley 27.743) ''
		  Font.Charset = DEFAULT_CHARSET
		  Font.Color = clWindowText
		  Font.Name = ''Calibri''
		  Font.Size = 9
		  Font.Style = [fsBold, fsUnderline]
		  TextAlignment = taRightJustified
		  Transparent = True
		  mmHeight = 3969
		  mmLeft = 12700
		  mmTop = <mmTopTitulo>
		  mmWidth = 81492
		  BandType = 4
		end
		object ppLabel30: TppLabel
		  UserName = ''Label30''
		  AutoSize = False
		  Caption = ''I.V.A. contenido $: ''
		  Font.Charset = DEFAULT_CHARSET
		  Font.Color = clWindowText
		  Font.Name = ''Calibri''
		  Font.Size = 8
		  Font.Style = [fsBold]
		  TextAlignment = taRightJustified
		  Transparent = True
		  mmHeight = 3440
		  mmLeft = 34660
		  mmTop = <mmTopTituloIva>
		  mmWidth = 27517
		  BandType = 4
		end
		object ppDBText14: TppDBText
		  UserName = ''DBText14''
		  BlankWhenZero = True
		  DataField = ''Iva''
		  DataPipeline = <pipeline>
		  DisplayFormat = ''#,0.00;-#,0.00''
		  Font.Charset = DEFAULT_CHARSET
		  Font.Color = clBlack
		  Font.Name = ''Calibri''
		  Font.Size = 8
		  Font.Style = []
		  ParentDataPipeline = False
		  TextAlignment = taRightJustified
		  Transparent = True
		  AbacoFormat = rbafCurrency
		  DataPipelineName = ''<pipeline>''
		  mmHeight = 3440
		  mmLeft = 65881
		  mmTop = <mmTopValorIva>
		  mmWidth = 27781
		  BandType = 4
		end
		object ppLabel37: TppLabel
		  UserName = ''Label37''
		  AutoSize = False
		  Caption = ''Otros Impuestos Nac.Indirectos $: ''
		  Font.Charset = DEFAULT_CHARSET
		  Font.Color = clWindowText
		  Font.Name = ''Calibri''
		  Font.Size = 8
		  Font.Style = [fsBold]
		  TextAlignment = taRightJustified
		  Transparent = True
		  mmHeight = 3440
		  mmLeft = 18785
		  mmTop = <mmTopTituloImpuestos> 
		  mmWidth = 43127
		  BandType = 4
		end
		object ppDBText15: TppDBText
		  UserName = ''DBText15''
		  BlankWhenZero = True
		  DataField = ''ImpuestosInternos''
		  DataPipeline = <pipeline>
		  DisplayFormat = ''#,0.00;-#,0.00''
		  Font.Charset = DEFAULT_CHARSET
		  Font.Color = clBlack
		  Font.Name = ''Calibri''
		  Font.Size = 8
		  Font.Style = []
		  ParentDataPipeline = False
		  TextAlignment = taRightJustified
		  Transparent = True
		  AbacoFormat = rbafCurrency
		  DataPipelineName = ''<pipeline>''
		  mmHeight = 3704
		  mmLeft = 65881
		  mmTop = <mmTopValorImpuestos>
		  mmWidth = 27517
		  BandType = 4
		end
		';
		
/* 	Salidas  = 1, 6, 2,7, 202, 207, 201, 206
	Entradas = 3, 8, 203 
*/
		
	if coalesce(afipCbte,6) in (6,7) then 
		pipeline := 'plTotalesS';
	else
		pipeline := 'plTotalesE';
	end if;
		
	cadena_a_agregar := replace(cadena_a_agregar, '<pipeline>', pipeline);
	cadena_a_agregar := replace(cadena_a_agregar, '<mmTopShape>', mmtopShape);
	cadena_a_agregar := replace(cadena_a_agregar, '<mmTopTitulo>', mmTopTitulo);
	cadena_a_agregar := replace(cadena_a_agregar, '<mmTopTituloIva>', mmTopTituloIva);
	cadena_a_agregar := replace(cadena_a_agregar, '<mmTopValorIva>', mmTopValorIva);
	cadena_a_agregar := replace(cadena_a_agregar, '<mmTopTituloImpuestos>', mmTopTituloImpuestos);
	cadena_a_agregar := replace(cadena_a_agregar, '<mmTopValorImpuestos>', mmTopValorImpuestos);
	cadena_a_agregar := cadena_qr || chr(13) || cadena_a_agregar;
	
	return replace(cadena_entrada, cadena_qr, cadena_a_agregar);

END;
$BODY$;

ALTER FUNCTION public.nuevoTemplate(varchar, integer, integer)
    OWNER TO abacouser;	

